package com.mf.handler;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import com.mf.entity.bo.exportExcel.ExportColumnsBo;
import com.mf.entity.bo.exportExcel.ExportExcelBo;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;

import java.util.List;

/**
 * @Author: lmf
 * @Create: 2024/6/27 8:26
 * Description:自定义规则
 */
@Slf4j
public class CustomWidthAndHeightRule extends AbstractColumnWidthStyleStrategy {
    private static final int MAX_COLUMN_WIDTH = 255;
    private final ExportExcelBo exportExcelBo;

    public CustomWidthAndHeightRule(ExportExcelBo exportExcelBo) {
        this.exportExcelBo = exportExcelBo;
    }


    /**
     * 设置列的宽度。
     * 此方法用于根据头部配置或数据行配置来设置Excel列的宽度。对于头部行，它会设置行的高度；
     * 对于数据行，它会根据配置设置列的宽度和行的高度。
     *
     * @param writeSheetHolder 包含写入Excel表格的持有者，用于获取和设置Sheet对象。
     * @param cellDataList 细胞数据列表，包含要写入的单元格数据。
     * @param cell 当前处理的单元格对象。
     * @param head 表头信息，用于头部行的高度设置。
     * @param relativeRowIndex 相对行索引，用于某些逻辑判断，本方法中未使用。
     * @param isHead 标志位，表示当前处理的行是否为表头行。
     */
    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell,
                                  Head head, Integer relativeRowIndex, Boolean isHead) {
        // 如果当前处理的是表头行
        // 如果不需要设置列宽，则直接返回
        if (isHead) {
            // 获取配置的头部高度
            Integer headHeight = exportExcelBo.getHeadHeight();
            // 设置头部行的高度，如果未配置，则使用默认高度
            // 默认头部高度
            int DEFAULT_ROW_HEAD_HEIGHT = 20;
            cell.getRow().setHeightInPoints(headHeight != null && headHeight != 0 ? headHeight :
                    DEFAULT_ROW_HEAD_HEIGHT);
            return;
        }

        // 确保当前单元格的列索引在配置的列范围内
        // 暂时不确定为什么下标会超出范围 先添加一个判断
        if (cell.getColumnIndex() < exportExcelBo.getColumns().length) {
            // 获取当前单元格对应的自定义列配置
            // 自定义列信息
            ExportColumnsBo customColumn = exportExcelBo.getColumns()[cell.getColumnIndex()];

            // 根据配置设置列宽度，如果未配置，则使用默认宽度
            // 设置宽度
            boolean isWidth = customColumn.getWidth() != null && customColumn.getWidth() != 0;
            int DEFAULT_COLUMN_WIDTH = 20 * MAX_COLUMN_WIDTH;
            writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), isWidth ?
                    (customColumn.getWidth() * MAX_COLUMN_WIDTH) : DEFAULT_COLUMN_WIDTH);

            // 根据配置设置行高度，如果未配置，则使用默认高度
            // 设置行高度
            boolean isHeight = exportExcelBo.getRowHeight() != null && exportExcelBo.getRowHeight() != 0;
            int DEFAULT_ROW_HEIGHT = 20;
            cell.getRow().setHeightInPoints(isHeight ? exportExcelBo.getRowHeight() : DEFAULT_ROW_HEIGHT);
        }
    }


}
